#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#define NUM_OF_SENSOR 12   //测试数据的数量

#include <QMainWindow>

#include <QMdiSubWindow>
#include <QtSql/QSqlDatabase>
#include <QMessageBox>
#include <QDebug>
#include <stdio.h>
#include <string>
#include <regex>

#define IP "10.22.4.48"
#define PORT 10500

class SubWidget1;       //前置声明
class SubWidget2;
class SubWidget_Serial;
class MyThreadForSubwidget1;
class MyThreadForSubwidget2;
class MyThreadForSql;
class MyThreadForSerial;
class Motor;
class QTcpSocket;
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_actionw1_triggered();

    void on_actionw2_triggered();

    void on_action_serial_triggered();

    void on_radioButton_clicked();

    void on_pushButton_clicked();

    void socket_write_SLOT(int index, double data);

    void on_pushButton_socket_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_removeSensor_clicked();

    void on_pushButton_addSensor_clicked();

private:
    Ui::MainWindow *ui;

    QMdiSubWindow *m_w1;    //这俩就实现了传统的多文档结构，及一个窗口中，还包含了多个子窗口，类似于excel之类的；
    QMdiSubWindow *m_w2;    //也可以将QMdiArea中的SubWindowView设计成TabledView,这样是闲出来的多稳当就像是几个标签了
    //QWidget *m_w3_Serial; //QWidget是SubWidget_Serial的父类，所以我们创建这个也没问题，但是还是别创建父类对象指向子类了，因为QWidget父类不是一个接口类，这样调用不了子类新写成员函数
    SubWidget_Serial *m_w3_Serial;
    MyThreadForSubwidget1 *m_thread_w1;
    MyThreadForSubwidget2 *m_thread_w2;
    MyThreadForSql *m_thread_sql;
    MyThreadForSerial *m_thread_Serial;
    QSqlDatabase m_db;
    SubWidget2 *m_w2_test;
    SubWidget1 *m_w1_test;
    Motor *m_motor;
    QTcpSocket* tcpsocket;

    QString m_ip;
    double m_port;
    //std::vector<std::vector<char>> m_addr;
    std::vector<double> m_equipmentInfo;

private:
    //css样式只能在这里设置，SubWidget1和SubWidget2的css样式，因为，我们是用QMdiSubWindow创建界面，而非直接用SubWidget1对象来创建，所以修改SubWidget1样式不会更新到这里
    //对于css样式的设置，一定要在m_w1、m_w2和m_w3建立对象之后才行
    void qss_style(QWidget &w, QString path);
    bool tryMatch(std::string str, std::string pattern, std::smatch& results);
    bool refreshComboBoxRemoveSensorType();     //更新ComboBox内容
};
#endif // MAINWINDOW_H
